""" Burning Ship Fraktal www.3d-meier.de 22.01.1015 """ import c4d import math import cmath from c4d import gui from c4d import documents # Variablen und Konstanten Titel = 'Burning-Ship' xMin = -1.80 # Wertebereich x xMax = -1.70 yMin = -0.02 # Wertebereich y yMax = 0.08 Nx = 1500 # Anzahl Punkte x Ny = 1500 # Anzahl Punkte y Nmax = 35 # Iterationstiefe zMax = 2.0 # Maximaler z Wert Faktor = 1000 # Skalierungsfaktor # Eingabedialog class MyDialogs(gui.GeDialog): res = False # Erzeugung des Layouts def CreateLayout(self): self.SetTitle(Titel) # Eingabe der Konstanten self.GroupBegin(2000, c4d.BFH_CENTER, 2, 0, "Bereich Apfelmännchen") self.GroupBorder(c4d.BORDER_ROUND) self.GroupBorderSpace(15, 5, 15, 5) self.GroupSpace(90, 2) self.AddStaticText(2001, c4d.BFH_LEFT, 0, 0, 'x-Min', c4d.BORDER_NONE) self.AddEditNumber(1001, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2002, c4d.BFH_LEFT, 0, 0, 'x-Max', c4d.BORDER_NONE) self.AddEditNumber(1002, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2003, c4d.BFH_LEFT, 0, 0, 'y-Min', c4d.BORDER_NONE) self.AddEditNumber(1003, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2004, c4d.BFH_LEFT, 0, 0, 'y-Max', c4d.BORDER_NONE) self.AddEditNumber(1004, c4d.BFH_CENTER, 100, 0) self.GroupEnd() self.AddSeparatorV(300, c4d.BFH_CENTER) # Eingabe der Startwerte self.GroupBegin(2005, c4d.BFH_CENTER, 2, 0, "Berechnung") self.GroupBorder(c4d.BORDER_ROUND) self.GroupBorderSpace(15, 5, 15, 5) self.GroupSpace(27, 2) self.AddStaticText(2006, c4d.BFH_LEFT, 0, 0, 'Anzahl Punkte x', c4d.BORDER_NONE) self.AddEditNumberArrows(1005, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2007, c4d.BFH_LEFT, 0, 0, 'Anzahl Punkte y', c4d.BORDER_NONE) self.AddEditNumberArrows(1006, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2008, c4d.BFH_LEFT, 0, 0, 'Iterationstiefe', c4d.BORDER_NONE) self.AddEditNumberArrows(1007, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2009, c4d.BFH_LEFT, 0, 0, 'z-Max', c4d.BORDER_NONE) self.AddEditNumber(1008, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2009, c4d.BFH_LEFT, 0, 0, 'Skalierungsfaktor', c4d.BORDER_NONE) self.AddEditNumber(1009, c4d.BFH_CENTER, 100, 0) self.GroupEnd() self.AddSeparatorV(300, c4d.BFH_CENTER) # Dialog mit OK schließen self.AddDlgGroup(c4d.DLG_OK|c4d.DLG_CANCEL) return False # Werte übernehmen wenn Dialog geschlossen def AskClose(self): global xMin, xMax, yMin, yMax, Nx, Ny, Nmax, zMax, Faktor xMin = self.GetReal(1001) xMax = self.GetReal(1002) yMin = self.GetReal(1003) yMax = self.GetReal(1004) Nx = self.GetLong(1005) Ny = self.GetLong(1006) Nmax = self.GetLong(1007) zMax = self.GetFloat(1008) Faktor = self.GetReal(1009) return False # ????? def Command(self, id, msg): if id == 1:self.res = True if id == 1 or id == 2: self.Close() return True # Variablen im Eingabemenü setzen def InitValues(self): self.SetReal(1001, xMin) self.SetReal(1002, xMax) self.SetReal(1003, yMin) self.SetReal(1004, yMax) self.SetLong(1005, Nx, 1, 1000000000) self.SetLong(1006, Ny, 1, 1000000000) self.SetLong(1007, Nmax, 1, 1000000000) self.SetFloat(1008, zMax) self.SetReal(1009, Faktor) return True def CreatePolygonObject(): # Polygonobjekt erzeugen obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject((Nx+1)*(Ny+1), Nx*Ny) obj.SetName(Titel) # Variablen zz=0 # Zaehler # Segmentbreiten berechnen dx=(xMax-xMin)/(Nx-1) dy=(yMax-yMin)/(Ny-1) # Punkte erzeugen for j in xrange(0,Ny+1): for i in xrange(0,Nx+1): # Berechnung der Punkte y=yMax-j*dy x=xMin+i*dx # Punkt speichern obj.SetPoint(zz, c4d.Vector((x-dx/2)*Faktor,(y+dy/2)*Faktor,0)) # Zähler erhöhen zz=zz+1 # Polygone erzeugen zz=0 # Zähler zurücksetzen for j in xrange(0,Ny): for i in xrange(0,Nx): # Komplexe Zahl bilden y=yMax-j*dy x=xMin+i*dx c=complex(x, -y) #print(c.imag) # Iteration z = 0 for k in xrange(0,Nmax): if abs(z) > zMax: break z = (complex(abs(z.real), abs(z.imag))**2) + c if abs(z) < zMax: # Punkte für ein Quadrat definieren P1=j*(Nx+1)+i P2=j*(Nx+1)+i+1 P3=(j+1)*(Nx+1)+i+1 P4=(j+1)*(Nx+1)+i # Quadrat speichern obj.SetPolygon(zz, c4d.CPolygon(P1,P2,P3,P4)) # Zähler erhöhen zz=zz+1 # obj.Message(c4d.MSG_UPDATE) return obj def main(): dlg = MyDialogs() dlg.Open(c4d.DLG_TYPE_MODAL) if dlg.res: plyobj = CreatePolygonObject() doc.InsertObject(plyobj, None, None, True) #doc.SetName(Titel) doc.SetActiveObject(plyobj) c4d.CallCommand(14039) # Mesh optimieren c4d.EventAdd() if __name__=='__main__': main()